A Generic Deriving Mechanism for Haskell